package com.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.user.authentication.LoginAuthentication;
import com.user.authentication.LoginDetail;
import com.user.domain.dto.CheckLoginDto;
import com.user.domain.dto.ForceLoginDto;
import com.user.domain.dto.RegisterDto;
import com.user.domain.params.SecurityParams;
import com.user.domain.params.UpdateUserParams;
import com.user.domain.dto.UserDto;
import com.user.domain.pojo.User;
import com.user.domain.vo.UserInfo;
import com.user.domain.vo.UserPubInfo;
import com.user.domain.vo.UserVo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.util.List;
import java.util.Map;


/**
 * <p>
 *  服务类
 * </p>
 *
 * @author 小杰大人
 * @since 2025-02-17
 */
public interface IUserService extends IService<User> {

    User getDetailById(Long usersId);

    void updateUserDetail(UpdateUserParams userParams);

    void updatePhone(SecurityParams securityParams);

    void updateEmail(SecurityParams securityParams);

    UserInfo getUserInfoById(Long userId);

    boolean updateUserAvatar(Long id , Long mediaId);

    UserVo getUserVo(Long id);

    void addUsers(UserDto userDto);

    void updateUsers(UserDto userDto);

    void removeUsers(List<Long> ids);

    /**
     * 用户注册
     * @param registerDto
     */
    void registerUser(RegisterDto registerDto);

    /**
     * 发送验证码
     * @param phone
     */
    void sendSmsPhoneCodeByLogin(String phone);

    void login(HttpServletRequest request, HttpServletResponse response,LoginDetail loginDetail);

    void logout(HttpServletRequest request, HttpServletResponse response);

    /**
     * 校验账号是否已经登入
     */
    boolean checkLogin(String username, String phone);

    /**
     * 是否关注指定用户
     * @param followUserId 指定用户id
     * @return true关注 false未关注
     */
    Boolean isFollow(Long followUserId);

    /**
     * 关注指定用户
     * @param followUserId  指定用户id
     * @param isFollow true关注 false取消关注
     */
    void follow(Long followUserId, Boolean isFollow);

    /**
     *
     * @param module 1我关注的人 2 关注我的人 3 共同关注
     * @param sorted 按关注时间 1 升序 2 降序
     * @param query 用户类型
     * @return 用户列表
     */
    List<UserInfo> getUserFollowList(Integer module, Integer sorted, String query);

    /**
     * 获取用户公开信息 个人主页
     * @param id 用户id
     * @return 个人主页信息
     */
    UserPubInfo getUserPublicInfo(Long id);

    /**
     * 获取用户列表 key=用户id value=用户主体对象
     * @param ids 用户id列表
     * @return 用户列表信息
     */
    Map<Long, UserInfo> querySelectUserListByIds(List<Long> ids);

    /**
     * 获取用户角色名称列表
     * @param id 用户id
     * @return
     */
    List<String> getUserRoleNameList(Long id);

    /**
     * 发送邮箱验证码 校验使用（绑定 + 换绑）
     * @param email
     */
    void sendSmsEmailCodeByValidate(String email);

    /**
     * 发送手机号验证码 校验使用（绑定 + 换绑）
     * @param phone
     */
    void sendSmsPhoneCodeByValidate(String phone);

    /**
     * 根据用户唯一标识获取用户数据
     * @param uniqueIdentification 用户名 或 唯一id
     * @return 用户数据
     */
    User querySelectByUniqueIdentification(Object uniqueIdentification);

    /**
     * 获取用户粉丝数量
     * @param userId 用户id
     * @return 用户粉丝数量
     */
    Long getUserFansCount(Long userId);


    User querySelectByUsername(String username);


}
